﻿using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;

namespace Medianamik.Core.Interfaces
{
    public interface INode: IQueryableNode
    {
        NodeInstance AddNodeInstance(string pCultureName);
        IEnumerable<Breadcrumb> Breadcrumbs { get; }
        bool CanHaveChildNodes { get; }
        int ChildNodeCount { get; }
        System.Globalization.CultureInfo DefaultCulture { get; set; }
        NodeInstance DefaultInstance { get; }
        string DisplayName { get; }
        IEnumerable<Node> GetChildContentNodes(System.Globalization.CultureInfo pCulture, bool inclusive);
        IEnumerable<Node> GetChildContentNodes(System.Globalization.CultureInfo pCulture);
        IDictionary<string, T> GetValues<T>(string propertyName);
        bool HasChildren { get; }
        bool HasInstanceForCurrentEditionCulture { get; }
        bool HasName { get; }
        ReadOnlyCollection<Security.InheritedPermission> InheritedPermissions { get; }
        ReadOnlyNodeInstanceCollection Instances { get; }
        bool InstancesLoaded { get; }
        bool IsDraft { get; }
        bool IsParentOf(Node pParentNode);
        Collection<NodeType> LegitimateChildTypes { get; }
        long LongPosition { get; }
        bool MayBeMoveTo(Guid? pParentNodeId);
        string Name { get; }
        Guid NamePropertyId { get; }
        NodeType NodeType { get; }
        Node ParentNode { get; }
        IEnumerable<Node> ParentNodes { get; }
        ReadOnlyCollection<Security.Permission> Permissions { get; }
        void RemoveNodeInstance(string pCultureName);
        bool RespectsNodeHierarchicalRules();
        bool RespectsTypeHierarchicalRules();
        NodeInstance this[System.Globalization.CultureInfo pCulture] { get; }
        NodeInstance this[string pCultureName] { get; }
        bool UseInChildUrls { get; }
        WebSite WebSite { get; }
        EntityStates Status { get; set; }
        bool IsLanguageNeutral { get; }
    }
}
